#include "entree.h"

entree nouvelleEntreeCteInt(char * nom, int valeur)
{
	entree nouveau;
	valeurCte val = {ENTREE_TYPECTE_ENTIER, valeur, NULL};
	nouveau.nom = nom;
	nouveau.typeEntree = ENTREE_TYPEENTREE_CTE;
	nouveau.valeur = val;
	return nouveau;
}

entree nouvelleEntreeCteBool(char * nom, int valeur)
{
	entree nouveau;
	valeurCte val = {ENTREE_TYPECTE_BOOL, valeur, NULL};
	nouveau.nom = nom;
	nouveau.typeEntree = ENTREE_TYPEENTREE_CTE;
	nouveau.valeur = val;
	return nouveau;
}

entree nouvelleEntreeCteChar(char * nom, char * valeur)
{
	entree nouveau;
	valeurCte val = {ENTREE_TYPECTE_CHAR, 0, valeur};
	nouveau.nom = nom;
	nouveau.typeEntree = ENTREE_TYPEENTREE_CTE;
	nouveau.valeur = val;
	return nouveau;
}

entree nouvelleEntreeFct(char * nom, int nbArg, int * typeArg, int typeRetour)
{
	entree nouveau;
	nouveau.nom = nom;
	nouveau.typeEntree = ENTREE_TYPEENTREE_FCT;
	nouveau.typeArg = typeArg;
	nouveau.typeRetour = typeRetour;
	nouveau.nbArg = nbArg;
	return nouveau;
}

char * entreeToString(entree x)
{
	char * retour;
	switch (x.typeEntree)
	{
		case ENTREE_TYPEENTREE_CTE :
			retour = entreeConstanteToString(x);
			break;
		case ENTREE_TYPEENTREE_FCT :
			retour =  entreeFonctionToString(x);
			break;
		default :
			retour = "Erreur : entreeToString : type entree non reconnu";
			break;
	}
	
	return retour;
}

char * entreeConstanteToString(entree x)
{
	char * retour = malloc(sizeof(char) * 1024);
	
	switch (x.valeur.type)
	{
		case ENTREE_TYPECTE_ENTIER :
			sprintf(retour,"%s = %d",x.nom,x.valeur.valeurIntBool);
			break;
		case ENTREE_TYPECTE_BOOL :
			if(x.valeur.valeurIntBool)
			{
				sprintf(retour,"%s = VRAI",x.nom);
			}
			else
			{
				sprintf(retour,"%s = FAUX",x.nom);
			}
			break;
		case ENTREE_TYPECTE_CHAR :
			sprintf(retour,"%s = %s",x.nom,x.valeur.valeurChar);
			break;
		default :
			retour = "Erreur : entreeConstanteToString : type entree constante non reconnu";
			break;
	}
	
	return retour;
}

char * entreeFonctionToString(entree x)
{
	char * retour = malloc(sizeof(char) * 1024);
	char * arguments = malloc(sizeof(char) * 1024);
	
	switch (x.nbArg)
	{
		case 0 :
			arguments = "";
			break;
		case 1 :
			sprintf(arguments,"%s",entreeTypeCteToString(x.typeArg[0]));
			break;
		case 2 :
			sprintf(arguments,"%s, %s",entreeTypeCteToString(x.typeArg[0]),entreeTypeCteToString(x.typeArg[1]));
			break;
		case 3 :
			sprintf(arguments,"%s, %s, %s",entreeTypeCteToString(x.typeArg[0]),entreeTypeCteToString(x.typeArg[1]),entreeTypeCteToString(x.typeArg[2]));
			break;
		case 4 :
			sprintf(arguments,"%s, %s, %s, %s",entreeTypeCteToString(x.typeArg[0]),entreeTypeCteToString(x.typeArg[1]),entreeTypeCteToString(x.typeArg[2]),entreeTypeCteToString(x.typeArg[3]));
			break;
		default :
			arguments = "Erreur : entreeFonctionToString : nb arguments entree fonction non reconnu ou > 5";
			break;
	}
	
	sprintf(retour,"%s %s (%s)",entreeTypeCteToString(x.typeRetour),x.nom,arguments);
	
	return retour;
}


char * entreeTypeCteToString(int type)
{
	char * retour = malloc(sizeof(char) * 1024);
	
	switch (type)
	{
		case ENTREE_TYPECTE_ENTIER :
			retour = "int";
			break;
		case ENTREE_TYPECTE_BOOL :
			retour = "bool";
			break;
		case ENTREE_TYPECTE_CHAR :
			retour = "char *";
			break;
		default :
			retour = "Erreur : entreeTypeCteToString : type entree type constante non reconnu";
			break;
	}
	
	return retour;	
}
	
	
